home *** CD-ROM | disk | FTP | other *** search
/ SGI Freeware 1999 August / SGI Freeware 1999 August.iso / dist / fw_tkcvs.idb / usr / freeware / lib / tkcvs / merge.tcl.z / merge.tcl
Encoding:
Text File  |  1999-04-16  |  16.2 KB  |  495 lines

  1.  
  2. # TCL Library for tkCVS
  3.  
  4. #
  5. # $Id: merge.tcl,v 1.5 1995/11/15 04:30:11 davide Exp $
  6. #
  7.  
  8. proc merge_setup {} {
  9. # By: Eugene Lee, Aerospace Corporation, 11/12/95
  10.   global cvsglb cvsroot GetVenModule from_to sel_to
  11. #puts "merge_setup entered"
  12.   toplevel .merge
  13.   
  14.   frame .merge.left
  15.   frame .merge.right
  16.   frame .merge.vendor -relief groove -border 2
  17.   frame .merge.down -relief groove -border 2
  18.   frame .merge.feedback -relief groove -border 2
  19.  
  20.   pack .merge.feedback -side bottom -fill x -expand yes
  21.   pack .merge.down -side bottom -fill x -expand yes  
  22.   pack .merge.vendor -side bottom -fill x -expand yes
  23.   pack .merge.left   -side left
  24.   pack .merge.right  -side right -fill x -expand yes 
  25.  
  26.   label .merge.left.lcwd      -text "Current Directory"   -anchor w
  27.   label .merge.left.lmodule   -text "Module Location"    -anchor w
  28.   
  29.   entry .merge.right.tcwd      -relief sunken -width 40;  # use with cwd later
  30.   entry .merge.right.tmodule   -width 40;           # use with module_dir later
  31.   
  32.   pack .merge.left.lcwd       -side top   -fill x -pady 3
  33.   pack .merge.left.lmodule    -side top   -fill x
  34.   pack .merge.right.tcwd      -side top   -fill x -pady 3
  35.   pack .merge.right.tmodule   -side top   -fill x
  36.   
  37.   frame .merge.vendor.name 
  38.   pack .merge.vendor.name -side top -fill x -expand yes
  39.   label .merge.vendor.name.l -text "Vendor Module" -anchor w
  40.   entry .merge.vendor.name.e -relief sunken 
  41.   pack .merge.vendor.name.l -side left -fill x -pady 3
  42.   pack .merge.vendor.name.e -side right -anchor w -fill x -pady 3 -expand yes
  43.   .merge.vendor.name.e config -state disabled
  44. #  button .merge.vendor.b -text \
  45. #    "Select Module With Vendor Code From Repository" -anchor w \
  46. #    -command "GVM_selector"
  47.   button .merge.vendor.b -text \
  48.     "Select Module With Vendor Code From Repository" -anchor w \
  49.     -command "venselect_run"
  50.   pack .merge.vendor.b -side top -ipadx 2 -ipady 2  \
  51.     -padx 4 -pady 4  
  52.   frame .merge.vendor.l
  53.   frame .merge.vendor.r
  54.   pack .merge.vendor.l .merge.vendor.r -side left 
  55.   
  56.   foreach i {l r} {
  57.     if { $i == "l" } {
  58.       set x "From"
  59.     } else {
  60.       set x "To"
  61.     }
  62.     label .merge.vendor.$i.rev -text "$x Revision Tags"
  63.     pack .merge.vendor.$i.rev -side top
  64.     
  65.     frame .merge.vendor.$i.scroll 
  66.       eval {listbox .merge.vendor.$i.scroll.list \
  67.       -yscrollcommand [list .merge.vendor.$i.scroll.sy set] \
  68.       -xscrollcommand [list .merge.vendor.$i.scroll.sx set]} \
  69.       -relief sunken -width 40 -height 15
  70.       scrollbar .merge.vendor.$i.scroll.sx -orient horizontal \
  71.         -command [list .merge.vendor.$i.scroll.list xview] \
  72.         -relief sunken
  73.       scrollbar .merge.vendor.$i.scroll.sy -orient vertical \
  74.         -command [list .merge.vendor.$i.scroll.list yview] \
  75.         -relief sunken
  76.         pack .merge.vendor.$i.scroll.sx -side bottom -fill x
  77.         pack .merge.vendor.$i.scroll.sy -side right -fill y
  78.         pack .merge.vendor.$i.scroll.list -side left -fill both -expand true
  79.     pack .merge.vendor.$i.scroll -side top
  80.     
  81.     frame .merge.vendor.$i.f
  82.     pack .merge.vendor.$i.f -side bottom 
  83.     label .merge.vendor.$i.f.l -text $x
  84.     if { $i == "l" } {
  85.     
  86.       label .merge.vendor.$i.f.s -textvariable merge(from) -relief sunken \
  87.         -width 15
  88.     } else {
  89.       label .merge.vendor.$i.f.s -textvariable merge(to) -relief sunken \
  90.         -width 15
  91.     }
  92.     
  93.     pack .merge.vendor.$i.f.l -side left -padx 3 -pady 3
  94.     pack .merge.vendor.$i.f.s -side left -pady 3
  95.   }
  96.     
  97.   button .merge.ok -text "OK" -command do_merge
  98.   button .merge.quit -text "Quit" -command { wm withdraw .merge }
  99.   pack .merge.ok .merge.quit -in .merge.down -side left \
  100.     -ipadx 2 -ipady 2 -padx 4 -pady 4 -fill both -expand 1
  101.     
  102.   entry .merge.feedback.e  
  103.   pack .merge.feedback.e -fill x -expand yes
  104.   .merge.feedback.e configure -text "Hello"
  105.     
  106.   bind .merge.vendor.l.scroll.list <Double-1> {
  107.     get_j .merge.vendor.l.scroll.list left
  108.   }
  109.   bind .merge.vendor.r.scroll.list <Double-1> {
  110.     get_j .merge.vendor.r.scroll.list right
  111.   }
  112.   
  113.   wm withdraw .merge
  114.   wm title .merge "Module Level Merge With Vendor Code" 
  115.   wm minsize .merge 30 10
  116.   
  117. }
  118.  
  119. proc get_j { list side} {
  120. # Written by Eugene A. Lee, Aerospace Corp., 12/20/94
  121.     global merge
  122.     if {[string compare [$list curselection] ""] \
  123.        == 0} return
  124.  
  125.     set Sel [$list get [$list curselection]]
  126. #puts "side=$side"
  127.     if {$side == "left"} {
  128.        set merge(from) [lindex [split $Sel] 0]
  129.     } else {
  130.        set merge(to) [lindex [split $Sel] 0]
  131.     }
  132. }
  133.  
  134. proc put_rev_tags {} {
  135. # Written by Eugene A. Lee, Aerospace Corp., 11/12/95
  136.   #Called by button .venselect.ok in venget.tcl 
  137.     global cvsroot merge venselect_mcode location
  138.     set tmpwdir [eval pwd]
  139. #puts "tmpwdir=$tmpwdir"
  140. #puts "venselect_mcode=$venselect_mcode"
  141.     .merge.vendor.l.scroll.list delete 0 end
  142.     .merge.vendor.r.scroll.list delete 0 end
  143.     # Find directory where venselect_mcode is.
  144.     set dir $cvsroot/$location($venselect_mcode)
  145. #puts "From put_rev_tags, dir=$dir"
  146.     cd $dir
  147.     get_rv_tags r_tag_list v_tag_list
  148. #puts "r_tag_list=$r_tag_list"
  149.     cd $tmpwdir
  150.     if { [info exists r_tag_list] == 0 } {
  151.       foreach i {l r} {
  152.         .merge.vendor.$i.scroll.list insert end "No revision tags found"
  153.       }
  154.     } else {
  155.       for {set i 0} {$i < [llength $r_tag_list]} {incr i} {
  156.         set tmp [lindex $r_tag_list $i]
  157.         .merge.vendor.l.scroll.list insert end $tmp
  158.         .merge.vendor.r.scroll.list insert end $tmp
  159.       }
  160.     }
  161. }
  162. proc merge_run {} {
  163.   global cwd module_dir
  164. #puts "merge_run invoked"
  165. #puts "cwd=$cwd"
  166. #puts "module_dir=$module_dir"
  167.   if {$module_dir == "Not a CVS directory."} {
  168.     cvserror $module_dir
  169.     return
  170.   }
  171.   .merge.right.tcwd configure -text cwd
  172.   .merge.right.tmodule configure -text module_dir
  173.   wm deiconify .merge
  174.  
  175. proc do_merge {} {
  176.   global merge
  177. #  puts "Entered do_merge"
  178. #  puts "pwd=[exec pwd]"
  179.   set merge(3rd_party) [.merge.vendor.name.e get]
  180.   if { $merge(3rd_party) == "" } {
  181.     puts "Vendor Module not specified"
  182.     return
  183.   }
  184. #puts "merge(3rd_party)=$merge(3rd_party)"
  185.   if { $merge(from) == "" || \
  186.        $merge(to) == "" } {
  187.     puts "not all entries filled"
  188.     return
  189.   }
  190. #  puts "merge(from)=$merge(from)"
  191. #  puts "merge(to)=$merge(to)"
  192.   set merge(mod_dir) [exec pwd]
  193.   
  194.   set mess "This will merge differences between $merge(from) and\
  195.     $merge(to) of $merge(3rd_party) into $merge(mod_dir)
  196.     
  197. Are you sure?"
  198.   set confirm [tk_dialog .message {Confirm!} $mess warning 0 OK Quit]
  199.   
  200.   if {$confirm == 0} {  
  201.     set mktemp "/tmp/[exec whoami][pid]"
  202.     set mktemp_dir $mktemp.dir
  203. #puts "mktemp_dir=$mktemp_dir"
  204.     catch {exec cvs checkout -d $mktemp_dir -r$merge(from) $merge(3rd_party)} \
  205.       view_this
  206.     view_output "CVS Checkout of temp file for $merge(3rd_party)" $view_this
  207.   
  208.     catch {rm -rf CVS_save}
  209.     eval exec mv CVS CVS_save
  210.     eval exec cp -R $mktemp_dir/CVS .
  211.     eval exec rm -rf $mktemp_dir
  212.   
  213. #puts "merge(mod_dir)=$merge(mod_dir)"
  214. #puts "merge(3rd_party)=$merge(3rd_party)"
  215.     catch {eval exec cvs checkout -d $merge(mod_dir) -j$merge(from) \
  216.       -j$merge(to) $merge(3rd_party) } view_this
  217.     view_output "CVS Module Level Merge of $merge(3rd_party) into $merge(mod_dir)" \
  218.       $view_this
  219.   
  220.     eval exec rm -rf CVS
  221.     eval exec mv CVS_save CVS
  222.   
  223.   wm withdraw .merge 
  224.   }     
  225.   
  226. }
  227.  
  228. proc unpack_tag_word { tag_word type tag_message} {
  229.   ##############################################################################
  230.   # Unpacks vendor and release tag information obtained from an RCS ,v file.
  231.   # In an RCS ,v file, between the keywords "symbols" and "locks" keywords,
  232.   # there are packed words with the following format:
  233.   #
  234.   #            tag_info:tag_ident
  235.   #
  236.   # where: tag_info is either the vendortag or releasetag which was entered
  237.   #        when a cvs checkin or import command was invoked. 
  238.   #        tag_ident is of the form: 
  239.   #          x.y.z for a vendor tag (3 subfields or 2 dots)
  240.   #          x.y,  x.y.z.w, or x.y.z.w.u.v for a release tag
  241.   #
  242.   # Called by:
  243.   #
  244.   # input: tag_word - word from a RCS ,v file between the "symbols" and "locks"
  245.   #                   keywords
  246.   # output: type - 0 if tag_word contains packed info on a release tag
  247.   #                1 if tag_word contains packed info on a vendor tag
  248.   # output: tag_message - a vendortag or releasetag as entered when a cvs 
  249.   #         checkin or import command was invoked
  250.   # 
  251.   # By: Eugene A. Lee, Aerospace Corporation
  252.   # Date: Sept 15, 1995
  253.   ##############################################################################
  254.   upvar $type typ $tag_message tag_m
  255.   set fields [split $tag_word :]
  256.   set tag_m [string trimleft [lindex $fields 0]]
  257.   set tag_num [string trimleft [lindex $fields 1]]
  258. #puts "tag_num=$tag_num"
  259.   # strip off any trailing ; character
  260.   regsub {;$} $tag_num "" tag_num
  261. #puts "   tag_num=$tag_num"
  262. #set xx [split $tag_num . ]
  263. #puts "xx=$xx $"
  264. #set len [llength $xx]
  265. #puts "len=$len"
  266.   if { [llength [split $tag_num . ]]  == 3 } {
  267.     set typ 1; # release tag
  268.   } else {
  269.     set typ 0; # vendor tag
  270.   }
  271. #puts "typ=$typ"
  272. }
  273. proc get_sort_list { in_list a_switch } {
  274.   ##################################################################################
  275.   # Compute a list which contains indices pointing to the order in which
  276.   # the input list is sorted. Sorted list is not returned.
  277.   # 
  278.   # input: in_list - input list
  279.   # input: a_switch - one switch to be used with the lsort command, i.e., -ascii, 
  280.   #                   -integer, -real, -increasing, -decreasing
  281.   #
  282.   # Called by: get_rv_tags
  283.   # return: indx_list - list of indices pointing to the order in which a local
  284.   #         copy of in_list is sorted
  285.   #
  286.   # By: Eugene Lee, Aerospace Corporation, Sept. 16, 1995
  287.   ###################################################################################
  288.   set tmp_list $in_list
  289.   set s_list [lsort $a_switch $tmp_list]
  290.   set xx_pat "#!#!"; # any pattern which will never be an element of in_list
  291.   set n [llength $in_list]
  292.  
  293.   for {set i 0} {$i < $n} {incr i} {
  294.   # Step through sorted list and look for a match with an element of in_list
  295.     set tmpi [lindex $s_list $i]
  296.     set j 0
  297.     while {$j < $n} {
  298.       # Step through input list
  299.       set tmpj [lindex $tmp_list $j]
  300.       set k $j
  301.       incr j
  302.       if {$tmpj == $xx_pat} {continue}
  303.       if {[string compare $tmpj $tmpi] == 0 } {
  304.         # found one
  305.         lappend index_list $k
  306.         set tmp_list [lreplace $tmp_list $k $k $xx_pat]
  307.         break
  308.       }
  309.     }
  310.   }
  311. #  puts "From get_sort_list, lindex_list=$index_list"
  312.   return $index_list
  313. }
  314.  
  315. proc sort_with_index_list { list s_list } {
  316.   # Called by get_rv_tag
  317. #puts "entered sort_with_index_list, list=$list  s_list=$s_list"
  318.   set n [llength $list]
  319.   if { $n != [llength $s_list] } {
  320.     puts "Error in sort_with_index_list, length of list & s_list are not equal"
  321.   }
  322.   for {set i 0} {$i < $n} {incr i} {
  323.     set j [lindex $s_list $i]
  324.     lappend sorted_list [lindex $list $j]
  325.   }
  326. #puts "sorted_list=$sorted_list"
  327.   return $sorted_list
  328. }
  329.  
  330. proc get_rv_tags { r_tag_list v_tag_list } {
  331.   #########################################################################
  332.   # Read all ,v files in a CVS repository module and extract all packed
  333.   # releasetag and vendortag words which are between the keywords "symbols"
  334.   # "locks".
  335.   #
  336.   # Packed releasetag word has the format:
  337.   #                releasetag:branch_id
  338.   #   where: releasetag was specified when the cvs import command was invoked. 
  339.   #          branch_id is of the forms: x.y, x.y.z.w, x.y.z.w.u.v, etc,
  340.   #          (odd number or subfields)
  341.   #
  342.   # Packed vendortag word has the format:
  343.   #                vendortag:branch_id 
  344.   #   where: vendortag was specified when the cvs import command was invoked. 
  345.   #          branch_id is of the forms: x.y.z (3 subfields or 2 dots)
  346.   #
  347.   # The output lists are created by processing each ,v file and appending to
  348.   # the appropriate output list only if the releasetag or vendortag information
  349.   # is new to the output list.
  350.   #
  351.   # Output: r_tag_list    - sorted releasetag list for the CVS module
  352.   # Output: v_tag_list    - sorted vendortag list for the CVS module
  353.   #
  354.   # Note: v_tag_list has no planned use for tkcvs yet. They are returned just
  355.   #       because this information was available.
  356.   #         
  357.   # By: Eugene A. Lee, Aerospace Corporation, November 12, 1995
  358.   #########################################################################
  359.   global merge
  360.   upvar $v_tag_list vtag_list
  361.   upvar $r_tag_list rtag_list
  362.   set first_module 1
  363. #puts "from get_rv_tags, pwd=[exec pwd]"
  364.   foreach module [glob *,v] {
  365. #puts ""
  366. #puts "module=$module"
  367.     set file [open $module r]
  368. #puts "file=$file"
  369.     while { [eof $file] == 0 } {
  370.       set line [gets $file]
  371. #puts "line=$line"
  372.       if {[string range $line 0 6] == "symbols" } { 
  373.         # Start of packed releasetag/vendortag
  374.         set line_list [split $line]
  375.         set nfields [llength $line_list]
  376.         catch {unset rlist};   # rlist = releasetag of current file
  377.         catch {unset vlist};   # vlist = vendortag for current file
  378.  
  379.         if {$nfields > 1 } {
  380.           # release and vendor tags are on the same line that "symbol" is on.
  381.           # (Assumes that next line will be "locks")
  382. #puts "format 1 line=$line"
  383.           for {set i 1} {$i < 3} {incr i} {
  384.             set tmp [string trimleft [lindex $line_list [expr $nfields - $i]]]
  385.             unpack_tag_word $tmp type tag_message
  386. #puts "tmp=$tmp"
  387. #puts "type=$type"
  388.             lappend tlist $type
  389.             if {$type == 0 } {
  390.               lappend rlist $tag_message
  391. #puts "rlist=$rlist"
  392.             }
  393.             if {$type == 1 } {
  394.               lappend vlist $tag_message
  395.             }
  396.           }
  397.           break; # Assumes that next line will be "locks"
  398.         } else {
  399.           # release and vendor tags on separate lines following the symbol line
  400. #puts "format 2"
  401.           while { 1 > 0 } {
  402.             set line [gets $file]
  403. #puts "line=$line"
  404.             if { [string range $line 0 4 ] == "locks" } {break}
  405.             unpack_tag_word $line type tag_message
  406. #puts "type=$type"
  407.             lappend tlist $type
  408.             if {$type == 0 } {
  409.               lappend rlist $tag_message
  410.             } else {
  411.               lappend vlist $tag_message
  412.             }
  413.           }
  414.         }          
  415.       }
  416.     }
  417.     close $file
  418.     # Compile master list of all releasetag and vendortag info for the CVS
  419.     # module
  420.     if {$first_module == 1 } {
  421. #puts "first_module entered"
  422.  
  423.       if { [info exists rlist] == 1 } {
  424.         set mrlist $rlist;     # mrlist = master releasetag list
  425. #puts "mrlist=$mrlist"
  426.       }
  427.       if { [info exists vlist] == 1 } {
  428. #puts "vlist=$vlist"
  429.         set mvlist $vlist;     # vrlist = master vendortag list
  430.       }
  431. #puts "mvlist=$mvlist"
  432.       set first_module 0
  433.     } else {
  434.       # Add to rtag_list only if it is a new release tag 
  435.       if { [info exists rlist] == 1 } {
  436.         for {set i 0} {$i < [llength $rlist] } {incr i} {
  437.           set tmp_rel [lindex $rlist $i]
  438.           set new_rel 1
  439.           foreach rel $mrlist {
  440. #puts "tmp_rel=$tmp_rel   rel=$rel"
  441.             if { [string compare $tmp_rel $rel ] == 0 } {
  442.               set new_rel 0
  443.               break
  444.             }
  445.           }
  446.           if { $new_rel == 1 } {
  447.             # Found a new release tag
  448. #puts "       $tmp_rel is a new release tag"
  449.              lappend mrlist [lindex $rlist $i]
  450. #puts "       mrlist=$mrlist"
  451.           }
  452.         }
  453.       }
  454.       # Add to vtag_list only if it is a new vendor tag 
  455.  
  456.       if { [info exists vlist] == 1 } {
  457.         for {set i 0} {$i < [llength $vlist] } {incr i} {
  458.           set tmp_ven [lindex $vlist $i]
  459.           set new_ven 1
  460.           foreach ven $mvlist {
  461. #puts "tmp_ven=$tmp_ven   ven=$ven"
  462.             if { [string compare $tmp_ven $ven ] == 0 } {
  463.               set new_ven 0
  464.               break
  465.             }
  466.           }
  467.           if { $new_ven == 1 } {
  468.             # Found a new vendor tag
  469. #puts "       $tmp_ven is a new vendor tag"
  470.              lappend mvlist [lindex $vlist $i]
  471. #puts "       mvlist=$mvlist"
  472.           }
  473.         }
  474.       }
  475.     }  
  476.   }
  477.   # Unsorteded master releasetag and versiontag lists have been found.
  478. #puts "unsorted release and version tag list have been found"
  479.   if { [info exists mrlist] == 1 } {
  480.     set rtag_list [lsort $mrlist]
  481. #puts "rtag_list=$rtag_list"
  482.   } else {
  483.     puts "no mrlist created"
  484.   }
  485.   if { [info exists mvlist] == 1 } {
  486.     set vtag_list [lsort $mvlist]
  487. #puts "vtag_list=$vtag_list"
  488.   } else {
  489.     puts "no mvlist created"
  490.   }
  491.   
  492. }
  493.  
  494.